; *************************************************************************
; Copyright (c) 1992 Xerox Corporation.  
; All Rights Reserved.  
;
; Use, reproduction, and preparation of derivative works are permitted.
; Any copy of this software or of any derivative work must include the
; above copyright notice of Xerox Corporation, this paragraph and the
; one after it.  Any distribution of this software or derivative works
; must comply with all applicable United States export control laws.
;
; This software is made available AS IS, and XEROX CORPORATION DISCLAIMS
; ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
; PURPOSE, AND NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY
; LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS
; EXPRESSLY DISCLAIMED, WHETHER ARISING IN CONTRACT, TORT (INCLUDING
; NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION IS ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGES.
; *************************************************************************
;
; port to R6RS -- 2007 Christian Sloma
; 

(library (clos std-protocols add-method)
  
  (export generic-add-method)
  
  (import (only (rnrs) define quote if cons filter lambda not and eq? for-all)
          (clos private allocation)
          (clos private method-cache)
          (clos std-protocols generic-invocation)
          (clos slot-access)
          (clos introspection)
          (clos private compat))
  
  (define (generic-add-method generic method
                              compute-apply-generic)
    (slot-set! generic
               'methods
               (merge-new-method method (slot-ref generic 'methods)))
    (if (generic-invocation-generic? generic)
        (invalidate-method-caches!))
    (set-instance-proc! generic (compute-apply-generic generic)))
  
  (define (merge-new-method new-method methods)
    (cons new-method
          (filter (lambda (method)
                    (not (and (for-all eq?
                                     (method-specializers new-method)
                                     (method-specializers method))
                              (eq? (method-qualifier new-method)
                                   (method-qualifier method)))))
                  methods)))
 
  ) ;; library (clos std-protocols add-method)
